于 2019 年 6 月发布的 ECMAScript 2019 (简称 ES10),在增强现有 API 功能、修复历史问题、提升开发便捷性 三个方向新增了实用特性。
一、 Array.prototype.flat() 和 Array.prototype.flatMap()
解决嵌套数组的扁平化处理,避免手动递归或多程序循环
1. flat(depth)
将嵌套数组扁平化,参数 depth 指定扁平化的深度(默认值为 1),返回新的数组(不改变原数组)。
const arr = [1, [2, [3, 4]]];
arr.flat(); // [1,2,[3,[4]]];
arr.flat(2); // [1,2,3,[4]];
arr.flat(3); // [1,2,3,4];
特殊处理:会自动过滤数组中的空元素 ([1, 3].flat(); // [1, 3])
2. flatMap(callback)
相当于 map() 后调用 flat(1),但性能更优(一次遍历完成)。适用于“映射后需要浅度扁平化”的场景。
const arr = ['hello earthnut', 'Love my China'];
arr.flatMap(words => words.split(' '));
// ['hello', 'earthnut', 'Love', 'my', 'China']
二、 String.prototype.trimStart() 和 String.prototype.trimEnd()
补充 trim() 的功能,支持单独去除字符串开头/结尾空白字符(空格、制表符、换行符)。
trimStart():去除字符串开头的空白trimEnd():去除字符串结尾的空白
三、 Object.formEntries()
最为 Object.entries() 的逆操作,将“键值对数组”转换为对象,简化数据格式转换。
// 从键值对数组创建对象
const entries = [
['name', 'ES10'],
['year', 2019],
];
Object.fromEntries(entries); // { name: 'ES10', year: 2019 }
// 处理Map转对象(Map的entries()返回键值对迭代器)
const map = new Map([
['a', 1],
['b', 2],
]);
Object.fromEntries(map); // { a: 1, b: 2 }
// 处理对象过滤/转换
const obj = { a: 1, b: 2, c: 3 };
const filtered = Object.entries(obj)
.filter(([k, v]) => v > 1)
.map(([k, v]) => [k, v * 2]);
Object.fromEntries(filtered); // { b: 4, c: 6 }
四、 可选的 Catch 绑定
解决了不需要 catch 块的错误参数时,允许省略参数,简化代码
try {
JSON.parse('invalid');
} catch {
// 无需参数
console.log('解析失败');
}
五、 Symbol.prototype.description
方便获取创建 Symbol 时的描述字符串,避免通过 toString() 简介提取。
const sym = Symbol('这是一个Symbol');
sym.toString(); // "Symbol(这是一个Symbol)"(需截取)
sym.description; // "这是一个Symbol"(直接获取)
// 无描述时返回undefined
Symbol().description; // undefined
六、 Function.prototype.toString() 改进
让 toString() 返回函数的完整源代码(包括注释、空格、参数默认值等),更符合直觉。
ES10 前,toString()可能省略函数体中的注释或简化格式;ES10 要求精确返回函数的原始代码(除了环境相关的细节,如绑定的 this)。
好像在 ES7 中见过 Function.prototype.toString() 的改进
七、 Array.prototype.sort() 稳定性优化
规范 sort()的稳定性,确保排序后 “相等元素” 的相对顺序保持不变。
好像在 ES7 中见过 Array.prototype.sort() 的稳定性提升
八、 JSON 超集支持
好像在 ES9 中见过 JSON 的 超集支持
九、 规范了 JSON.stringify()
确保 JSON.stringify() 输出“符合标准的 JSON 字符串”,避免因为“孤立代理项”导致的无效 JSON。
Unicode 中,“代理项对”(如\uD83D\uDE00 表示 😀)是合法字符,但单个代理项(如\uD83D)是无效的。ES10 前,JSON.stringify()会将孤立代理项转为 �(替换字符),导致 JSON 无效;ES10 会将其转为对应的 Unicode 转义序列(如\ud83d),确保输出合法。
// 孤立代理项\uD83D
JSON.stringify('\uD83D');
// ES10前:"�"(无效JSON)
// ES10后:"\ud83d"(有效JSON,可被正确解析)
十、 JSON.stringify() 对 Symbol 的处理
修复了 JSON.stringify() 对 Symbol 类型的处理。
- 之前
JSON.stringify()会将 Symbol 转化为null - 现在会忽略 Symbol 类型的值
const obj = { a: 1, b: Symbol('test') };
// '{"a": 1}'
console.log(JSON.stringify(obj));